## Общая структура проекта для домашнего задания по параллельной загрузке данных

### Постановка задачи

Сделать параллельный обработчик файла с данными клиентов на основе подготовленного проекта с архитектурой.
Задание поможет отработать основные инструменты параллелизма на реалистичной задаче.
Программа-обработчик должна в параллельном режиме обработать файл с данными клиентов.
Каждая строка файла содержит:
-id (целое число)
-ФИО (строка),
-Email (строка)
-Телефон (строка).
Данные отсортированы по id. Нужно десериализовать данные клиента в объект и передать объект в метод класса, который сохраняет его в БД.

### Задание
1. Запуск генератора файла через создание процесса, сделать возможность выбора в коде, как запускать генератор, процессом или через вызов метода. Если вдруг встретится баг с генерацией, то его нужно исправить и написать об этом при сдаче работы.
2. Распараллеливаем обработку файла по набору диапазонов Id, то есть нужно, чтобы файл разбивался на диапазоны по Id и обрабатывался параллельно через Thread, сколько диапазонов столько потоков. Хорошо сделать настройку с количеством потоков, чтобы можно было настроить оптимальное количество потоков под размер файла с данными. Предусмотреть обработку ошибок в обработчике и перезапуск по ошибке с указанием числа попыток. Проверить обработку на файле, в котором 1 млн. записей, при сдаче задания написать время, за которое был обработан файл и количество потоков.
3. Вместо создания потоков через new Thread() использовать ThreadPool, при сдаче задания написать время, за которое был обработан файл и количество потоков.
4. Добавить сохранение в реальную БД, можно SQL Lite для простоты тестирования или для лучшего понимания специфики загрузки полноценную базу данных (MS SQL Server, PostgreSQL, Mongo и т.д.)
5. Сделать обработку файла в CSV формате, то есть написать генератор и разбор файла.
6. Дать обратную связь по 2-м домашним заданиям других студентов на курсе.

### Инструкция
1. Сделать форк репозитория из ссылки в материалах, можно изменить структуру проектов, классов и интерфейсов, как считаете нужным и в ReadMe.md описать за что отвечает проект, класс, интерфейс.
2. Реализовать 1 пункт задания, сделав в main проекта запуск процесса-генератора файла, его нужно будет собрать отдельно и передать в программу путь к .exe файлу, также сделать в Main вызов кода генератора из подключенного проекта, выбор между процессом или вызовом метода сделать настройкой (например аргумент командной строки или файл с настройками) со значением по умолчанию для метода.
3. Реализовать 2 пункт задания, сделав свои реализации для IDataLoader и IDataParser.
4. По желанию реализовать 3 пункт задания, сделав дополнительную реализацию IDataLoader.
5. По желанию реализовать 4 пункт задания, сделав дополнительную реализацию для ICustomerRepository и инициализацию БД при старте приложения, можно использовать EF.
6. По желанию реализовать 5 пункт задания, сделав дополнительную реализацию для IDataParser и IDataGenerator.
7. По желанию дать обратную связь по 2-м домашним заданиям других студентов на курсе, можно найти репозитории по форкам к этому репозиторию. Обратную связь можно описать, создав issue к репозиторию, пример обратной связи можно посмотреть из ссылки на проект в материалах, который рассматривается в рамках занятия. Чтобы обратная связь была качественной обязательно нужно похвалить работу, написав, что сделано хорошо и написать, что можно улучшить с пояснениями почему это сделает работу более качественной. Эти рекомендации работают и для code review, так как позволяют более конструктивно обсуждать коммиты.


### Оценка 
1. 1 балл
2. 3 балла
3. 1 балл
4. 1 балл
5. 1 балл
6. 1 балл

1 балл: Сделано 2 CodeReview
1 балл: CodeStyle, грамотная архитектура, всё замечания проверяющего исправлены

Всего 10 баллов, для приема задания достаточно 7 баллов.

### Otus.Teaching.Concurrency.Import.Loader

Консольное приложение, запускающее генератор данных `DataGenerator`  и запускающее реализацию `IDataLoader`.

### Otus.Teaching.Concurrency.Import.DataGenerator

Библиотека, в которой должна определена логика генерации файла с данными, в базовом варианте это CSV.

### Otus.Teaching.Concurrency.Import.DataGenerator.App

Консольное приложение, которое позволяет при запуске отдельно выполнить генерацию файла из `DataGenerator` библиотеки.

### Otus.Teaching.Concurrency.Import.DataAccess

Библиотека, в которой находится доступ к базе данных.

### Otus.Teaching.Concurrency.Import.Core

Библиотека, в которой определены сущности БД и основные интерфейсы, которые реализуют другие компоненты.
